{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TensorFlow2教程-mlp及深度学习常见技巧"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们将以mlp对为，基础模型，然后介绍一些深度学习常见技巧， 如：\n",
    "权重初始化， 激活函数， 优化器， 批规范化， dropout，模型集成 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras import layers\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.导入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 784)   (60000,)\n",
      "(10000, 784)   (10000,)\n"
     ]
    }
   ],
   "source": [
    "(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()\n",
    "x_train = x_train.reshape([x_train.shape[0], -1])\n",
    "x_test = x_test.reshape([x_test.shape[0], -1])\n",
    "print(x_train.shape, ' ', y_train.shape)\n",
    "print(x_test.shape, ' ', y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.基础模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_3\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_11 (Dense)             (None, 64)                50240     \n",
      "_________________________________________________________________\n",
      "dense_12 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_13 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_14 (Dense)             (None, 10)                650       \n",
      "=================================================================\n",
      "Total params: 59,210\n",
      "Trainable params: 59,210\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = keras.Sequential([\n",
    "    layers.Dense(64, activation='relu', input_shape=(784,)),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "])\n",
    "model.compile(optimizer=keras.optimizers.Adam(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = model.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'validation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 0s 25us/sample - loss: 0.4429 - accuracy: 0.9632\n"
     ]
    }
   ],
   "source": [
    "result = model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.权重初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_5\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_19 (Dense)             (None, 64)                50240     \n",
      "_________________________________________________________________\n",
      "dense_20 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_21 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_22 (Dense)             (None, 10)                650       \n",
      "=================================================================\n",
      "Total params: 59,210\n",
      "Trainable params: 59,210\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = keras.Sequential([\n",
    "    layers.Dense(64, activation='relu', kernel_initializer='he_normal', input_shape=(784,)),\n",
    "    layers.Dense(64, activation='relu', kernel_initializer='he_normal'),\n",
    "    layers.Dense(64, activation='relu', kernel_initializer='he_normal'),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "])\n",
    "model.compile(optimizer=keras.optimizers.Adam(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = model.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD8CAYAAACb4nSYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd8VFX+//HXyaT3CgkJEHpHSmiiCKIIqKio2FCwYUPU1Z+rW9S1rLrfXevaULGtoIgFVCwgICiIgPTeSYMkhBRSJlPO748zwCQkIYEJCTOf5+ORhzO3zJw7I+975txzzlVaa4QQQvgGv8YugBBCiNNHQl8IIXyIhL4QQvgQCX0hhPAhEvpCCOFDJPSFEMKHSOgLIYQPkdAXQggfIqEvhBA+xL+xC1BVfHy8Tk1NbexiCCHEGWXVqlV5WuuEE23X5EI/NTWVlStXNnYxhBDijKKU2luX7aR5RwghfIiEvhBC+BAJfSGE8CEnbNNXSk0DLgFytNbdq1mvgJeB0UApMFFr/Ydr3QTgb65Nn9Zaf3AyhbTZbGRkZFBeXn4yu4tqBAcHk5KSQkBAQGMXRQhxGtXlQu77wH+BD2tYPwro4PobALwBDFBKxQKPA2mABlYppeZorQ/Vt5AZGRlERESQmpqKOceIU6G15uDBg2RkZNCmTZvGLo4Q4jQ6YfOO1noxkF/LJpcBH2rjNyBaKZUEXATM01rnu4J+HjDyZApZXl5OXFycBL6HKKWIi4uTX05C+CBPtOknA+luzzNcy2paflIk8D1LPk8hfFOT6KevlJoETAJo1apVI5dGCCFql55fyr78UjIPlZFXYuXc9gn0SIlq7GLViSdCPxNo6fY8xbUsExhaZfmi6l5Aaz0VmAqQlpbWJG/aW1BQwPTp07n77rvrtd/o0aOZPn060dHRNW7z2GOPMWTIEC644IJTLaYQooGU2xzMXZ/Nh8v2sia9oNK6f7GVHslRXNe/FRf3TCIqpOl2kFB1uTG6UioV+KaG3jsXA5MxvXcGAK9orfu7LuSuAvq4Nv0D6Ku1ru36AGlpabrqiNzNmzfTpUuXE5azIe3Zs4dLLrmEDRs2VFput9vx928SP5jqrSl8rqJpcTo1+aUV5BRZyT1spXNiBM0jgxu7WEcVl9tYm17ImvRDrMsoxGp3EujvR6C/aanWWuN0QovoEAa1i6N/m9hTCuASq51fduSxYHMO8zYfIL+kgrbxYVw/oBXdWkSREhNCaKCFb9ZlM335PrYeKCbAojinfTyjeyRxSc8WhARaPHX4tVJKrdJap51ou7p02ZyBqbHHK6UyMD1yAgC01m8CczGBvwPTZfNm17p8pdRTwArXSz15osBvyh555BF27txJr169CAgIIDg4mJiYGLZs2cK2bdu4/PLLSU9Pp7y8nPvuu49JkyYBx6aVOHz4MKNGjeKcc85h6dKlJCcnM3v2bEJCQpg4cSKXXHIJV111FampqUyYMIGvv/4am83GZ599RufOncnNzeX6668nKyuLQYMGMW/ePFatWkV8fHwjfzLidCkstQEQFeq5WuRvuw7ywo/byCwoo7jcxmGrHadbPdDfT3FRt0RuHNSaAW1ia70WVFbhYNuBYnKKreQUl5NVUMaevFL2HCyhzOagb6sYBrSNo19qDC1jQvHzq/t1pXKbg6mLd/H6oh2U25wAtE0IIyLIH6vdSYXDLLMohVKwcGsO037djVIQFxbEkWK3iQvjjvPacn7nZie8rvXFHxk8+sV6rHYnEUH+DOmUwLX9WjK4XfxxZZ9wdio3DWrN2oxCvl2Xxdz1+1m4dR2vLdzBf8adRd/WsdUe0/7CcpKigwnyPz0nBqhjTf90OlFN/x9fb2RTVpFH37Nri0gev7Rbrdu41/QXLVrExRdfzIYNG452eczPzyc2NpaysjL69evHzz//TFxcXKXQb9++PStXrqRXr16MGzeOMWPGMH78+ONC/8EHH+Tee+/l9ddf548//uCdd95h8uTJJCcn8+ijj/L9998zatQocnNzTyn0pabvOQ6nZuWefPq2jsHfUr/+EYetdl5fuINDpTZ6t4ymV6to/JRiU3YRm11/W/cXk11YToBFMbpHEjcNSqVPq+ijwWVzOFmXUcBvu/LJKihjXFpLzmpZc5NifkkFz87dzGerMkiODmFA21gigwOICPYnPjyIZhFBRIcGsmDLAWauzKCwzMaQjgm8em3v4046h0oq+HDZXt5fuptDrhMTmBNGy9hQWseF4u/nx8q9+RS41gf5+9EmPoxWsaEEBVjw91OEBFoY2DaO8zomHK2dF5bZ+HVHHs99t4V9+aVc3COJa/qZY6utBm+1O1izr4Bluw5yoMjqWqpZsj2PjENldE6MYGyfZIL8Lfj5KVKiQxjaKeHo57lwaw63fbCStNYx3De8A/3axBJQj+9Va80vO/J49Iv1ZBWUMWlIO3qmRLEmvYA1+wrYlVdC3mFTrg7Nwpl119mn3CTksZq+qF7//v0r9XF/5ZVX+PLLLwFIT09n+/btxMXFVdqnTZs29OrVC4C+ffuyZ8+eal977NixR7f54osvAPjll1+Ovv7IkSOJiYnx6PGIk5dVUMYDn65h+e58LurWnFev63O0ueFEftmex58/X0dWYRnhgf7M+H1fpfUBFkW7hHAGtImlc1IkB4rKmbUyg9lrskiMDMbip3BqTUGpjTKbA4DgAD8+Xr6PczvEM3lYewa0rfz/4f7Cci55dQkFpTbuGtqOKed3qLEJYlC7OP50YSem/76P577bzJjXfuHtm9Lo2DyCDZmFfLoinVmrMiizObigSzOu6ptCi+gQmkUEEx8eWOkE6HRqtuUUs3pfAbtyD7Mzt4Q9B0uwOzR2p6agtILpy/fh76fokRJFTpGVzIIywATj9NsGcHb7ulVygvwtDGgbd9yx2xxO5qzJ4vVFO/jn3C2Vj7VtHE9d3p3DVjt3/+8PuiRF8O7EfoQH1T8mlVKc2yGB7+8fwjPfbuLNn3cCEOjvR7cWkQzv3IzkmBBCAiw8//0WJk//g2kT+9XrxHKyzrjQP1GN/HQJCws7+njRokXMnz+fZcuWERoaytChQ6vtAx8UFHT0scVioaysrNrXPrKdxWLBbrd7uOTeSWvN8t35zF6Tid2haREdQovoYM7r2IzEqIZrk/5+QzZ//nw9doeTcWkpzFyZwZ3/W8XrN/QhOKD6IHU6NSv3HmL68r18tSaLtglhzLpzEL1bxrArr4Q16QVorenWIor2zcKPO4E8NKITX67OZNXeQyhlmjQiggPol2qaTwIsio+X7+OdJbu5ZupvzLpzEGmpx5oXPli2h/ySCmbfc06depyEBFq49Zw29GoZxR0f/cEVr/1Kq7gwNmcXEejvxyU9k7hjSDs6JUbU+jp+forOiZF0Toysdr3DqVmTfoj5m3NYsTufPq1juGFgK7okRXJO+3iPBGKAxY8r+6Ywtk8yhWU2HE6NQ2t+3HiAf32/hVEvLyY4wEJCRBDvTex/UoHvLjzIn2fH9uSGAa1xODVdkiKP+z6jQgN4eNY6Hp+zkWcu797g3anPuNBvLBERERQXF1e7rrCwkJiYGEJDQ9myZQu//fabx99/8ODBzJw5kz//+c/8+OOPHDpU74HNXsnh1HywdA8f/baX3XklhAf5ExZkIafYitYQEeTPPy7rxhW9k0/qH5PDqfnijwxW7T3E/7uoE3Hh5oSstebVBTt4Yd42eqZE8cq1vUmND+OsltH89csN3P7hSt66sS+hgf6VXuvNn3cy4/d9ZBwqIzTQwp3nteP+CzocPUG0bxZO+2bhtZYpLMif8QNbM35g6xq3ufO8dowf2Jrz/rWQVxfs4INb+gOmHXnG7/sY0TWx3l0M+7aO5Zt7z+H/zVpLUZmNpy7rxpizkj12jcHip+jbOrba9m9PU0oRHRp49Pn4ga0Z2T2RZ+du4Y99h3hvYj8SIoJqeYX66Z5c82c9Lq0lu3JLePPnnbSND+O2c9t67H2rI6FfR3FxcQwePJju3bsTEhJC8+bNj64bOXIkb775Jl26dKFTp04MHDjQ4+//+OOPc9111/HRRx8xaNAgEhMTiYiovWbl7Uqsdu77ZA3zNx+gX2oMk4e1Z3SPJEICLVTYnezKO8zfv9rAn2au5afNOTxzRfdK/9CPyDts5bsN+/lmbRa5xVbObh/H0I7NcGrNv3/cyrYDhwFYsj2Pt29Ko0tSBM99t4W3Fu9ibJ9knhvb82jt7YYBrQnyt/DwrLVcO/U33rkpjWaRwVTYnTwwcw3frsvmnPbxPDiiIxd1S6x0UvC08CB/bjmnDf/3w1bWZxTSIyWKr1ZnUlBqY+Lg1JN6zcSoYD66dYBnC9pExIcH8Z9xZzXKez98USf25JWwcGsONw9ug6UeF7nr64y7kOurrFYrFosFf39/li1bxl133cWaNWtO6TUb43OtsDuZv/kAM37fx5b9xfRuGc3AtnEM69yMNvFhJ34Bl6yCMm79YCVb9xfx+KXdmHB2arXbHaldvzhvG92So/j8zkGV2pn/8+NWXlu4A6c2texWsaEs23nwaPt42/gwHrqoEykxIUz6cBWFZTYGt49n/uYD3DiwNf8Y063aXijzNx3g3hmriQkN4L839OHFedtYsj2Pv4zuzKQh7er3oZ2ConIbg59bwOB28bwxvg+jXl6CUoq5U86RUdlNTLnNgZ9Sdb4eVJVcyPUy+/btY9y4cTidTgIDA3n77bcbu0j14nBq3vt1N2/+vJO8wxW0iArm7HZxrN5XwI+bDvD891uY/6fzaBkbWuvraK2Zu34/j8/ZiNXmYNrEfgzt1KzG7S1+inuGtadlbChTZqxm6pJd3D20PQALthzg1QU7uKRnEpPPb0+n5hEopbDaHazYfYjCMhsjujU/2pY8Z/Jg7vjfKuZvPsCd57XjzyM71RicF3Rtzmd3DuKW91cw9vWl+Cn411U9GZfWstrtG0pkcAATz07l1QU7+Oi3vWzZX8y/ruwpgd8E1XQNyNOkpu/DTuVz1Vpz1ZvLKK1w8KcLO3JBl5r7PW/dX8zDn69jbXoB53aI55bBbRjSMeHoT9iNWYVc/MovPDSiI5PP71Dje+49WMJjszfy87ZcuidH8uK4XnRoXrcmLq01d3/8Bz9tzuGbKecQHRrAqJeWkBARxFf3DK7zPzir3cGW7GJ6pkTVKTizCsp4+ttNXNE7hQu7Nj/h9g0hv6SCwc8toNzuICY0kKWPnH/aAkacPlLTF3WSWVBGXFhgvUNg6c6DrNp7iOjQAG7/cCW9Wkbz90u60rf1sa6kWmve/WU3z3+/hYjgAF65rjeX9kw6Liy7tYiif2osX67O5J5h7Sutdzo1v+7MY+bKDH7YsJ9Afz+euLQrNw5KrVe7p1KKpy7vzvLdi3nos7VEhwZy2Grnk0kD63XsQf6WWvu/V9UiOoTXb+hb5+0bQmxYIDcMaMU7v+zmuv4tJfB9nIS+j9JaU1hmY9RzCwjy9yMtNYZz2icw4ezWdbq4+N6vu4kLC2Txw8P4Zl0WL83fzjVvLeNvF3dhwtmpaA3PzN3Mu7/s5qJuzXl2bE9iw46/iHrEFX2SefSL9WzILDraq2R3Xgk3TVtOen4ZUSEBXD+gFXcNbXfS0wLEhwfx1GXduWf6HwA8dXn3Ov9SONPdObQdReU2bhks90/wdRL6PkhrTVZBOcXldsb2TiY6NJClO/N4/vst7Mw9zL+vrtyDobDMRkSQ/9ELlnsPlvDTlhwmD2tPWJA/1/RrxegeSTzw6Vqe+HoT6zILcTg1s9dkcfPgVP5+cdcTDrkf3T2Jx2dv5MvVmfRIiUJrzWOzN1BQYuOV63ozomtzj9RQL+6ZxIo9qVjtTsYP8J0ZXePDg/jXVY3TM0U0LRL6PsbhdJJVUM6h0goigv35z7geR5tT/v3DVv67cAejuicyvItpf16+6yAT3vudczsk8PoNfQiw+PHB0r1YlKrUTzwiOICpN/blvwt38OL8bWgNfx7ZmTvPa1untu+o0ADO79yMOWuz+MvozszfnMOS7Xk8fmlXxpzVwqOfwRNjmsYAPyEag9wYvYGEh5sBNllZWVx11VXVbjN06FCqXrSu6qWXXqK0tPTo89GjR1NQUFDLHsfTWnOotII9eSVsyi7mUGkFzSODiQoJqBTIU4Z3oHNiBI98sZ5DJRVsyCzktg9WEh4UwLxNB3jos7UUldv4bGU6o3skHdfM4uenmDK8Ax/fNoB3J6Rx19B29eolcnnvZPIOW5m/OYenvtlEp+YR3FjLACQhRP1JTb+BtWjRglmzZp30/i+99BLjx48nNNR0ZZw7d269XyO7sJy8w1YCLH7EhQUSHRpAaKA/+ZmVtwv09+M/487isv/+yn2frmFDZiGRIQHMumsQX67O5F/fb2VDZiHFVjs31zK45+x2JzcJ3LDOZqKthz5be/Qia30nLxNC1E7+RdXRI488wmuvvXb0+RNPPMHTTz/N8OHD6dOnDz169GD27NnH7bdnzx66dze3ISgrK+Paa6+lS5cuXHHFFZXm3rnrrrtIS0ujW7duPP7444CZxC0rK4thw4YxbNgwwEzVnJeXB8ALL7xAl67d6NSlKy+++OLR9+vSpQu333473bp1Y/gFF5KRW0BcWCCdEyNoER1S64Xabi2imDK8A4u35eKn4KNb+5MUFcLdQ9tzz7B27Mwt4ayW0fRu5fkJ34L8LVzcM4nDVjtjzmrBwCqTZQkhTt2ZV9P/7hHYv96zr5nYA0Y9V+sm11xzDffffz/33HMPADNnzuSHH35gypQpREZGkpeXx8CBAxkzZkyNTRpvvPEGoaGhbN68mXXr1tGnT5+j65555hliY2NxOBwMHz6cdevWMWXKFF544QUWLlxIaGQ0pdZjk6+tWrWKadPe4/3Z89BOJxMuH8HQoUOJiYlh+/btzJgxgzfeeotLLr+Sn3/4hgfvvq3OTS13DW2HAkZ0S6RtwrF5YB4a0YlWsaH16rJYXxMGpbI7t4S/jJZxGUI0hDMv9BtJ7969ycnJISsri9zcXGJiYkhMTOSBBx5g8eLF+Pn5kZmZyYEDB0hMTKz2NRYvXsyUKVMA6NmzJz179sSpNQeKynl32v+Y/uE07A47eTkH2LRpEz179gTA7nCyO68Ep4YjY+mWLFnC0BGjiQgLJyLYn/NGXMyPCxZxzZVXHJ3COT2/lC7de3H4YHa9blgRYPHj3uHHD5JSSnFNv4bt8dIpMYIZkzw/d5EQwjjzQv8ENfKGdPXVVzNr1iz279/PNddcw8cff0xubi6rVq0iICCA1NTUaqdUronWmBsrb9jKW6+9xKzvFxEeGc0j991Jccmxi7c5ReWokCCCAvywO50cLrdRbLVjc2qSY0KICPYnwKIoKK3AanMQEBhIen4ph0oriAwNRNmttZRCCOFLpE2/Hq655ho++eQTZs2axdVXX01hYSHNmjUjICCAhQsXsnfv3lr3HzJkCNOnTwfg9z/WsH79OirsTiItNqIjI+jbIYUIXcKvC+eTf7gCp9aEhYeTkXuI+IhA2saHoVCkHyqjY89+LJ43lwBto6y0lEU/zqXvgEHsyiuhwu6kqNxGXFjgKc8HLoTwLpII9dCtWzeKi4tJTk4mKSmJG264gUsvvZQePXqQlpZG586da93/rrvu4qYJE2nfsTOt23WgW89epMSGMHhAGr1796Zz5860bNmSQWefTYXDyYGicsZeN4F7bryK1q1SWLRwIf4WRYDFj7N69eaWW26mf38zT/rtt93GyPPOZv2W7QT6+9ElKRI/pWRiLSFEJTLh2mlSVmEnp9hKYZkNP6WICw8kISIIf7/qf2xlHColv6QCgFaxoZXmgXdqjdYaSw371pU3fK5CCEMmXGsCtNYcttrJLbZy2GrHohTNIoKIDw86Yf/zpKgQSiscBFr8jrthsp9SIDV4IU4fpwMO7YGYNnCKla3GJqHvYVprSqx2CstsFJbZsTud+Fv8SIwKJjYssMaafVUWP0X7ZuEokCYaIRpTQTp8eSfs/QXi2sOAO+Gs6yCo9ttaNlVnzCmrqTVD1eRAkZVdeSUcKrURFmShVWwonZtH0CwiuM6Bf0RDtsmfKZ+nECdNa9i7zPyd7P/v62fBG4Mhew0MeRiCo2DuQ/BiV1jwNJTmm+1K8+HHv8HTifDuRbD5G/PrAMBaDOkroGCfZ47rFJ0RNf3g4GAOHjxIXFxck6715haXk1NcTmxoIC2iQ+rVN/500lpz8OBBgoNPbopiIapVmg/2cog8iQnytIaSXAiv5i5oOZvBP8g0rVT3719rKC8EW6kJWkcFbP8RVk6DvG1mm7j20GcC9LoBwuo40nvhs/Dzc5DSH8ZOhdg2cP5fTYAvfRkW/x/89gZ0vgS2fgfWIuhyqTlBfHoDxKSCnz8c3Am4TjrRraHNuRAab8pcXgjxHSDtVog4PTfZOSMu5NpsNjIyMurVB/50K7HaOVRqIzTQQkxoYJNvcg8ODiYlJYWAgIATbyw8w+mEb+6D8ETTRHAkfMoLYfPXkNAZUk54Hc4zbOVQlAmFGXD4AITEQkxriEqB8iIo2AuF6ZB4FsS3r/21tIa1M+CHv4C9Aq58BzqPPn67ilL49WXYswS6jzVNJIFhJkTnPw57f4VLX4a+E4/ts/I9+OZ+8zgoEpp3h4AQE+x2qzlRFO8He9nx75fSz4SpUrDqfdi3DMKawY1fmFH4tVk+Fb77f+YkcekrYKmmfpyzGRb/GzZ+AR1GwPDHoHk3cNhhy9ew6gNzfElnmeWFGbB7Mez5BSpKICQaAsPNtQJLAPQYB4PugeZday9bDep6IfeMCP2mbuGWHG75YAXDOjXjrRv7Hr2nqhCVbP0eZlxjHgeEQp+boKwANs02oeUfAuM/h9TBJ/8eWoN2gl8N9x4ozYcl/4Hf3wZHXQbtKeg0CgZNhuQ+YD1sarS2MlOzthbD0ldh10JoOdCEcdZquPBJOPteE7hOB2z8EuY9Zk40Makm6IKjTCDuXmzCOLolZK2BG2ZC+wvM8o+ugDbnQdcxkL0ODmwEp93U/C0BEBoHEUkQkWgC1M8CymJCPaln5UPJWgOfXG+O4fpPofUgOLQXfnkBcraYWnrPceZ9P78NOo2GcR9WH/junM76Xdw9krlHaoYHd8Jvr8Pqj82vibuWnlRHDQn906SgtIILX1xMXFhgve61KryA1nBo9/HNDk4npP9mapoWt19SH1xq/oFfPxOW/RfWzTQ1we5XmlD77s9QmAk3fgmtBpiA++UlE87nPnQsxA7uhPlPwK6fISjChKd/IJTkweEcsATCxf+Gs6499t4VpbD8DfN6FYeh57WmmSEy2QRmaf6x2n1QlKn1hzeHrXPNCaIsv+bPITAcLnjC1Krt5fDVneZElpxmfsUc2gNOGyT2hFHPQ6tBkP67Cbr03yHtZhh4N6Bh2iiz/eWvwZwppmy3/miO0RMK0uGjy83n3Hm0Kafyg7gOkLPRnDAAWg00J+CAEM+8b12U5ptfA1VPVnXk0dBXSo0EXgYswDta6+eqrG8NTAMSgHxgvNY6w7XOARyZIW2f1npMbe91poX+/Z+s5pt12Xx1z2C6J3vof0xx8oqyTHupf823ZvSI4v0w517TdtxmCFz0T1O7zFoN3z4Imaug/yQY/X9m++x18Na5cME/4BxXc0VpPvgHQ2Coq+zZ8P5oE96tBsH2HyAwwtReywug21hTq/19qgn2HleaWnRZgTkxhCWYv4yVsG+p+SVx0T9hw+ew6DkozoaOo+CCx6FZPcZnVJSaJoySXBPwQRHml0pAqAnFhE4Q5jadttNp2ru3fmvasGPbQote0GVMzb9AjijMhHcugOIsU4u/fYH5ZeBJJXnwvyshZ5Np5z/nAYhKNrX9tTPMBddLX/LcieY08VjoK6UswDbgQiADWAFcp7Xe5LbNZ8A3WusPlFLnAzdrrW90rTusta5z36YzKfS/37CfO/+3ivsv6MD9F3Rs7OL4lvIi1895t5/VG7+CL26HlgNMLc0/qPbXKMmD5W+ZoPazmItuobEmcFufbQKr6s9su9XUfr/5k2ne6D0eNnwBZYcg9RzTXhuWYJotdsyDm2ZD26Hw5V2mVvmnjRBSy7TUhRnw/sXm9QbeDQPuAJRpQvntjWPvef7fTC24Og47LHoWlvwbLEHmhNBygDnhtB5Uhw+3ke1fD98+BBf+w9S4G4K9wvziCY1tmNdvBJ4M/UHAE1rri1zPHwXQWj/rts1GYKTWOl2Z7jWFWutI1zqvDP0DReVc/MoSmkcG89U9g6Ud/3Qp2Ac/PQXrZ0JyX7joWdMUsuIdExRx7eHgdnNRbOzU6ttGi7Lh15fMhTZ7OSR2B5RpCy/KNIELpqZnCTQ/+bXTtGXbXZ0JWvSGK6ZCQkez/eJ/w9pPoMfVMOxRs9+b55q27xu/hDfONs0YR2r+takoMeU58gvgiJKDJvSjW9bts9o+z5zU0m427dNNvXeBOCWeDP2rMIF+m+v5jcAArfVkt22mA8u11i8rpcYCnwPxWuuDSik7sAawA89prb+q5j0mAZMAWrVq1fdEE5c1JpvDyQdL9/DyT9upsDuZPXkwnRMjG7tYZ46yAtPuXJJjmgmSqtys22E3TSaH9phab0mOaUYIjjJhuPp/JrzOuha2/WCaLFoOgPTl0HEkXPWeaSte8BSc+6DpUeFu7zLXxbwi6HkNDL7fBPcRTifkbjE9SfK2mYuGTjugIDgSgqNND5fuV1Zur69Oxip490LTS6M0H+5dBXHtPPEpCnGc0z0Nw0PAf5VSE4HFQCbgGplAa611plKqLbBAKbVea73TfWet9VRgKpiavofK5HGbs4u4d8ZqduQcZkjHBB67pCvtm52Zo/I8InudCeQTdemzlZl25d+nQvbaY8v9/OGBjZWbKdZON23lYF47vJnZv6zAXAzsea3pKx2VYk4CS1813QB7j4dLXjY9Lc590PwiWPIf0wzUe7w5uaz9BL6eAtGtzMXB+OPvGYCfn+kyd5Ld5ipJ6Qvn/sm0b3e6WAJfNAl1Cf1MwP33ZIpr2VFa6yxgLIBSKhy4Umtd4FqX6frvLqXUIqAnQlZJAAAaDUlEQVQ3UCn0zwSlFXbu/vgPSqx23rkpjeFdmjXpgWINbsu3MHMCaIdpSjnv4eNDzek0te4l/zG9PxK6mJp3VEvT8+XLSaade8Adx/ZZ/xnEtoPb5pu2b/fP2GGv3H0uMAyGPmJC3r3WrRRc/IK5yLnqPVjxtnnPwnRIPdd0wztdbblDHgZU5Z40QjSiujTv+GMu5A7HhP0K4Hqt9Ua3beKBfK21Uyn1DODQWj+mlIoBSrXWVtc2y4DL3C8CV9VU2/T/+uV6pv++jxm3D/T+e7faymDhM2bASZshx6/fNAdm3QxJvcyFwd/fMf2ze1wF/W43A4yK98OXd8Dun6H9hTD4PnOh0z3EXz/bNPHc+oN5fjgH/tPJdE88/6+eOZbSfNg8x5S5WRcY/njD9+wRohF4rHlHa21XSk0GfsB02Zymtd6olHoSWKm1ngMMBZ5VSmlM8849rt27AG8ppZyYeX6eqy3wm6oFWw7w8fJ9TBrS9swM/NJ8UzPvcVXlfsflhabnSbfLj/UocTrhi0kmKJf+13QvHPZXU5O2W01NfM4UcxF1/OemnXvQvfDLi6a9fd2nputiYaa56HnpK6brYHW/irqPNW3vhRmmuWbTbHPBtPtYzx17aKwZ4ek+ylMIHyaDs07g4GErF720hPjwQGZPHkyQ/xk2+MrpMKMad/9sBqBc8ZZpa965EGbfY3qrRLc2TR4teplJo5a+Cuf/3TSHrHrf1OgjEs1IRVupGXk5fpappbuzFpsBR6veN90pL3258kXSqvJ3wSu9YcTTZvTmtJHmRHT3sob8RITwSjKfvoc8PmcjRWU2Prq1/5kX+GAG5ez+GQbeY2rS715g+o3vXGBOApe9Bgv/Ce+OMDX+dZ+aJppzHzS183bnm8FG5QVmHpL2F5hl1TWRBEVAv1vNX13EtjVdHzd8bgYe7VsGw/7myaMXQlQhoV+LRVtz+GZdNg9c0JEuSU20W+avL5s5XfrfDl0vqzzicft8WPwv6DUeRv4Thv4Zvv8LrPnYnASG/90093QcaeYaWfepeTzyuWPNMV0vMyMpG+qidbexMO/vZv4T8GzTjhDiONK8U4OyCgcjXvqZAIsf3913btOs5W/51vQ5D4o0/c5jUs3MhQEhpnfMry+bYfu3za880KeixPR8ced0mNp/68HHDwpqSAXp8FJ38zjpLLhj8el7byG8iDTvnKJXFmwnPb+MGbcPbJqBn7sNvrgDWvSBid/Cjvkm5Bc9e2ybsGamrb5qiFcNfDC/EDpc2LBlrk50y2ODq7pfefrfXwgfI6Ffja37i3l78S6u6pvCoHZNsLdOeZG5SYN/EFzzkQn1rmPMX0UpR2/YYAk68bSwTcFZ15n5b7pJ044QDe0MSITT7/nvtxAe7M9fRtdjJsKGsOoD02um40WVl3/3sJled8Ic09XR3elsmvGUvhOh88XV3zVJCOFRMktYFbvzSliwJYcJg1KJDTsNg3gqSkxXxUXPV16+8UszZcDnt8Hh3GPLs9ea6V8HTzGDnbyBUhL4QpwmEvpVfLB0DwEWxQ0DW3n2hQ/uhK/uNnfvcbfoWdNVcdE/zQAnMO31sydD8x6mX/yCp45tP/8fZiDV4Ps9Wz4hhE+Q5h03xeU2Zq3K4JKeLWgW4aGbhmsNf3wI3z8KthJzwfX2heamDdnrYNnrZkIwW7m5G5JfAKz+yLTXX/+pucPSb29Av9vM/DU7fzKDmUKiPVM+IYRPkdB3M2tVBoetdiaeneqZFzy409wXdMs3Zg6bwffBzIkw41rT4+brKWaagBFPmxGsFYfhx7+a27fd+KU5MZz3sJkd8oe/mPWRKWbwlBBCnAQJfRenU/PB0j30aRXNWS1PsRadu83ctWj9Z6bmPuJpMxjKzw+ummZujv3mOeaepFe+e2zem6vfh6/vh5b9zahZMOvO/6sZFQtw2esQ4KFfIUIInyOh77JoWw57Dpby4IhO9d+5osQ0wWT+AfvXmTlrAkLN7e7OvrfyfPEdR8CIZ+CHR6Hd8Mp90wNCYOxbx79+n4lmPhuQKXqFEKdEQt/lnSW7SYwMZmT3Gu47WpufnoTlb0J8RzPQaMCdJpzdbxbtbuBdENvGbFuX6Q0s/nDLj4A+8Y2lhRCiFhL6wOp9h1i68yB/Hd2l/ve6zdth7s/a92a49KW67aMUdBpVv/c5E/vfCyGaHOmyCby2cAfRoQFcP+AkumnOfxz8g2HYXzxfMCGE8DCfD/3N2UXM35zDLYPbEBZUzx8+e341PXPOuV8GFwkhzgg+H/qvLdxBeJA/EwalVr/Bus/MzUbKCysvdzpN98qIFqZnjhBCnAF8uk1/V+5hvl2fzR1D2hEVGnD8Blvmmpt3aydkrDSDpWJSze0H5z9hJgm7/E1pbxdCnDF8OvTf/HkngRY/bj2nzfEr03+HWbeYOd7Pe8Tc5Pvt883I2N+nmpr/gDuh5zWnv+BCCHGSfDb0S6x2vl6bzdg+ySREBFVembcdpo+DyCS4/jMIT4DbfoLpV8PPz5vRtSOfg+bdGqfwQghxknw29OdtOkCZzcEVvatMTay1mRhN+cH4z03gA8S3N3Pm5G6pe/96IYRoYnw29L9ak0mLqGDSWsdUXrF9HmT8Dpe8ZG7c7S4kGloNPH2FFEIID/PJ3jt5h60s2Z7HmF7J+Pm51didTjONcUyqmflSCCG8jE+G/tz12Ticmst7t6i8YsvXZu6c8x4BSzW9eYQQ4gznk6H/1epMOjWPoHNi5LGFTgcs/KeZP6fnuMYrnBBCNCCfC/19B0v5Y18Bl1Wt5W/43FykHfYXmdRMCOG16hT6SqmRSqmtSqkdSqlHqlnfWin1k1JqnVJqkVIqxW3dBKXUdtffBE8W/mTMXpMJwJizqoT+0lehWVfoclkjlEoIIU6PE4a+UsoCvAaMAroC1ymlulbZ7N/Ah1rrnsCTwLOufWOBx4EBQH/gcaVUle4yp9e367PplxpDSozbKNqczaYtv88Ec6MTIYTwUnVJuP7ADq31Lq11BfAJULU63BVY4Hq80G39RcA8rXW+1voQMA8YeerFPjklVjtbDxRzdrsq89yv+xSUpfINTYQQwgvVJfSTgXS35xmuZe7WAmNdj68AIpRScXXc97TZlF2E1tAjOerYQqfTTKrWfvixgVhCCOGlPNWW8RBwnlJqNXAekAk46rqzUmqSUmqlUmplbm6uh4p0vA2ZZqbMHiluob/3VyjKkDl0hBA+oS6hnwm0dHue4lp2lNY6S2s9VmvdG/ira1lBXfZ1bTtVa52mtU5LSGi42vb6zEISIoJoHul2Y/F1n0JgOHQa3WDvK4QQTUVdQn8F0EEp1UYpFQhcC8xx30ApFa+UOvJajwLTXI9/AEYopWJcF3BHuJY1ig2ZhZWbdmxlsGk2dBkj0yMLIXzCCUNfa20HJmPCejMwU2u9USn1pFJqjGuzocBWpdQ2oDnwjGvffOApzIljBfCka9lpV1phZ0fOYbq7h/6278FaJIOxhBA+o04Trmmt5wJzqyx7zO3xLGBWDftO41jNv9Fszi7GqaF7C9coXK1h5TSISDJTJQshhA/wmU7px13E/fVl2L0YBt8vI3CFED7DZ0J/fWYh8eGBJEYGw66f4ad/QLcrYMAdjV00IYQ4bXwm9DdkFtI9OQpVlGVugxjXAca8KjdDEUL4FJ8I/XKbg+05h+mVFAwzbwJ7OVzzPwiKaOyiCSHEaeUTd87anF2Ew+lkXObzkLkSxn0ECR0bu1hCCHHa+URNf0NmIZMtX9Ei/Rs4/+/QdcyJdxJCCC/kE6HPptk8FPAZuuc4OPfBxi6NEEI0Gu8P/fIirkx/lh2BXVCXyoVbIYRv8/rQd67+mFDK+KXDQxAQfOIdhBDCi3n3hVynE8fyqaxztiM0dUBjl0YIIRqdd9f0dy4goGAX79svIjU+rLFLI4QQjc67Q//3tygLjGOucwCp8TKLphBCeG/oH9wJ2+exPPYyAgKDSQgPauwSCSFEo/Pe0F/xDvhZ+NLvQtokhKGk144QQnhp6DsdsPpj6DKGNYUhpMZJe74QQoC3hn5JHlgLsbccRHp+KW3kIq4QQgDeGvrFWQDkqlicGqnpCyGEi5eG/n4A0m3mhinSXVMIIQzvDP0iU9PfUWamTm4roS+EEIC3hn7xflB+bC4OIiokgJiwwMYukRBCNAleGvpZENaMXflWadoRQgg3Xhr6+yEyiT15pbSJk5G4QghxhHeGflE2jrBEMgvKaBMf3tilEUKIJsM7Q784m6KABACZc0cIIdx4X+jbrVCWT66KAZCBWUII4cb7Qr84G4BMh/TRF0KIqrww9M3ArF1lkcSHBxIZHNDIBRJCiKajTqGvlBqplNqqlNqhlHqkmvWtlFILlVKrlVLrlFKjXctTlVJlSqk1rr83PX0Ax3ENzNpUEibTLwghRBUnvF2iUsoCvAZcCGQAK5RSc7TWm9w2+xswU2v9hlKqKzAXSHWt26m17uXZYtfCVdNfWxBCr04S+kII4a4uNf3+wA6t9S6tdQXwCXBZlW00EOl6HAVkea6I9VSchbYEseNwACkxIY1WDCGEaIrqEvrJQLrb8wzXMndPAOOVUhmYWv69buvauJp9flZKnVvdGyilJimlViqlVubm5ta99NUp3o+OSAIUoYGWU3stIYTwMp66kHsd8L7WOgUYDXyklPIDsoFWWuvewJ+A6UqpyKo7a62naq3TtNZpCQkJp1aSomwcYc0BCPKX0BdCCHd1Cf1MoKXb8xTXMne3AjMBtNbLgGAgXmtt1VofdC1fBewEOp5qoWtVnI0tLBGAIH/v65wkhBCnoi6puALooJRqo5QKBK4F5lTZZh8wHEAp1QUT+rlKqQTXhWCUUm2BDsAuTxX+OFpDcTYVIc0ACA6Qmr4QQrg7Ye8drbVdKTUZ+AGwANO01huVUk8CK7XWc4AHgbeVUg9gLupO1FprpdQQ4EmllA1wAndqrfMb7GisRWArxRpypHlHavpCCOHuhKEPoLWei7lA677sMbfHm4DB1ez3OfD5KZax7orMaNyyIHNdQGr6QghRmXdVhV1TMJQES01fCCGq412p6Ar9wwHxAARJTV8IISrxytAvOhL6UtMXQohKvCsVi7IhOIoyggAIDvCuwxNCiFPlXalYnA0RSZTbHIAMzhJCiKq8LPT3Q0QSVrsTgCCp6QshRCXelYqumr7VVdOXLptCCFGZ94S+02lq+pFuNX25kCuEEJV4TyqW5IJ2HK3pKwWBFu85PCGE8IQ6jcg9I4TEwO0LIbIF5UsOEeTvh1KqsUslhBBNiveEvn8gJPcBwGrLk547QghRDa9s/yi3OaWPvhBCVMMrk9Fqd0hNXwghquGVoV9uc0rPHSGEqIZXJqPV7pA++kIIUQ0vDX2p6QshRHW8MhnLbVLTF0KI6nhl6EtNXwghqueVyVhuc8hka0IIUQ2vTEar3UmwdNkUQojjeG3oS01fCCGO55XJWG6TwVlCCFEdrwx9qekLIUT1vC4ZnU5NhbTpCyFEtbwu9CsccqtEIYSoidclo9V25K5ZUtMXQoiq6hT6SqmRSqmtSqkdSqlHqlnfSim1UCm1Wim1Tik12m3do679tiqlLvJk4atTbj9yf1yvO58JIcQpO+FNVJRSFuA14EIgA1ihlJqjtd7kttnfgJla6zeUUl2BuUCq6/G1QDegBTBfKdVRa+3w9IEcITV9IYSoWV2qw/2BHVrrXVrrCuAT4LIq22gg0vU4CshyPb4M+ERrbdVa7wZ2uF6vwUhNXwghalaXZEwG0t2eZ7iWuXsCGK+UysDU8u+tx74eJTV9IYSomaeqw9cB72utU4DRwEdKqTq/tlJqklJqpVJqZW5u7ikVxOqq6cuEa0IIcby6JGMm0NLteYprmbtbgZkAWutlQDAQX8d90VpP1Vqnaa3TEhIS6l76apS7avoytbIQQhyvLqG/AuiglGqjlArEXJidU2WbfcBwAKVUF0zo57q2u1YpFaSUagN0AH73VOGrIzV9IYSo2Ql772it7UqpycAPgAWYprXeqJR6EliptZ4DPAi8rZR6AHNRd6LWWgMblVIzgU2AHbinIXvugNT0hRCiNicMfQCt9VzMBVr3ZY+5Pd4EDK5h32eAZ06hjPUiNX0hhKiZ1yWj1S7TMAghRE28LhnLba5++tJlUwghjuN1oS81fSGEqJnXJeORmr4MzhJCiON5Xehb7U4CLAqLn2rsogghRJPjfaFvc0otXwghauB1oV9ud8hka0IIUQOvS0ep6QshRM28LvTL7Q7puSOEEDXwunSUmr4QQtTM+0Jf2vSFEKJGXpeOpqbvdYclhBAe4XXpaLU7pHlHCCFq4HWhX25zSvOOEELUwOvSUWr6QghRM68LfanpCyFEzbwuHaWmL4QQNfPC0JfeO0IIUROvSketNeU2h9wfVwghauBVoW93apxa7o8rhBA18ap0PHqrRKnpCyFEtbwq9OVWiUIIUTuvSsejoS/NO0IIUS2vSkdp3hFCiNp5VehbbVLTF0KI2nhVOpbbTU0/SGr6QghRLa8KfanpCyFE7eqUjkqpkUqprUqpHUqpR6pZ/6JSao3rb5tSqsBtncNt3RxPFr4q65GavkzDIIQQ1fI/0QZKKQvwGnAhkAGsUErN0VpvOrKN1voBt+3vBXq7vUSZ1rqX54pcs3JXTV8mXBNCiOrVJR37Azu01ru01hXAJ8BltWx/HTDDE4WrL6npCyFE7eoS+slAutvzDNey4yilWgNtgAVui4OVUiuVUr8ppS6vYb9Jrm1W5ubm1rHox7NKTV8IIWrl6XS8FpiltXa4LWuttU4DrgdeUkq1q7qT1nqq1jpNa52WkJBw0m8uNX0hhKhdXUI/E2jp9jzFtaw611KlaUdrnen67y5gEZXb+z3qyIhcqekLIUT16pKOK4AOSqk2SqlATLAf1wtHKdUZiAGWuS2LUUoFuR7HA4OBTVX39ZQjI3Klpi+EENU7Ye8drbVdKTUZ+AGwANO01huVUk8CK7XWR04A1wKfaK212+5dgLeUUk7MCeY5914/nma1O1EKAiyqod5CCCHOaCcMfQCt9VxgbpVlj1V5/kQ1+y0FepxC+eql3OYg2N+CUhL6QghRHa9q/LbanTKtshBC1MKrEtJqcxIs7flCCFEjrwr9crtDavpCCFELr0pIq80pk60JIUQtvCohy+0OuYGKEELUwqtCX2r6QghRO69KSKvU9IUQolZeFfrlUtMXQohaeVVCWu0OmYJBCCFq4VWhX26TwVlCCFEbr0pIq90pNX0hhKiFl4W+Q6ZVFkKIWnhVQpoum1LTF0KImnhN6DudmgqH9N4RQojaeE1CHrtrltT0hRCiJl4U+kfumuU1hySEEB7nNQmplOLinkm0axbe2EURQogmq053zjoTRIUE8Nr1fRq7GEII0aR5TU1fCCHEiUnoCyGED5HQF0IIHyKhL4QQPkRCXwghfIiEvhBC+BAJfSGE8CES+kII4UOU1rqxy1CJUioX2HsKLxEP5HmoOGcKXzxm8M3j9sVjBt887voec2utdcKJNmpyoX+qlFIrtdZpjV2O08kXjxl887h98ZjBN4+7oY5ZmneEEMKHSOgLIYQP8cbQn9rYBWgEvnjM4JvH7YvHDL553A1yzF7Xpi+EEKJm3ljTF0IIUQOvCX2l1Eil1Fal1A6l1CONXZ6GopRqqZRaqJTapJTaqJS6z7U8Vik1Tym13fXfmMYuq6cppSxKqdVKqW9cz9sopZa7vvNPlVKBjV1GT1NKRSulZimltiilNiulBnn7d62UesD1//YGpdQMpVSwN37XSqlpSqkcpdQGt2XVfrfKeMV1/OuUUid98xCvCH2llAV4DRgFdAWuU0p1bdxSNRg78KDWuiswELjHdayPAD9prTsAP7mee5v7gM1uz58HXtRatwcOAbc2Sqka1svA91rrzsBZmOP32u9aKZUMTAHStNbdAQtwLd75Xb8PjKyyrKbvdhTQwfU3CXjjZN/UK0If6A/s0Frv0lpXAJ8AlzVymRqE1jpba/2H63ExJgSSMcf7gWuzD4DLG6eEDUMplQJcDLzjeq6A84FZrk288ZijgCHAuwBa6wqtdQFe/l1j7ugXopTyB0KBbLzwu9ZaLwbyqyyu6bu9DPhQG78B0UqppJN5X28J/WQg3e15hmuZV1NKpQK9geVAc611tmvVfqB5IxWrobwEPAw4Xc/jgAKttd313Bu/8zZALvCeq1nrHaVUGF78XWutM4F/A/swYV8IrML7v+sjavpuPZZx3hL6PkcpFQ58DtyvtS5yX6dNlyyv6ZallLoEyNFar2rsspxm/kAf4A2tdW+ghCpNOV74XcdgarVtgBZAGMc3gfiEhvpuvSX0M4GWbs9TXMu8klIqABP4H2utv3AtPnDk557rvzmNVb4GMBgYo5Tag2m6Ox/T1h3tagIA7/zOM4AMrfVy1/NZmJOAN3/XFwC7tda5Wmsb8AXm+/f27/qImr5bj2Wct4T+CqCD6wp/IObCz5xGLlODcLVlvwts1lq/4LZqDjDB9XgCMPt0l62haK0f1VqnaK1TMd/tAq31DcBC4CrXZl51zABa6/1AulKqk2vRcGATXvxdY5p1BiqlQl3/rx85Zq/+rt3U9N3OAW5y9eIZCBS6NQPVj9baK/6A0cA2YCfw18YuTwMe5zmYn3zrgDWuv9GYNu6fgO3AfCC2scvaQMc/FPjG9bgt8DuwA/gMCGrs8jXA8fYCVrq+76+AGG//roF/AFuADcBHQJA3ftfADMx1CxvmV92tNX23gML0UNwJrMf0bjqp95URuUII4UO8pXlHCCFEHUjoCyGED5HQF0IIHyKhL4QQPkRCXwghfIiEvhBC+BAJfSGE8CES+kII4UP+Py5dO0cTxWlFAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'validation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 0s 21us/sample - loss: 0.4355 - accuracy: 0.9587\n"
     ]
    }
   ],
   "source": [
    "result = model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.激活函数\n",
    "\n",
    "relu和sigmoid对比\n",
    "![image.png](https://camo.githubusercontent.com/4ebe11b2d35be8367317d7b2540969035a3684d4/687474703a2f2f63733233316e2e6769746875622e696f2f6173736574732f6e6e312f72656c752e6a706567)\n",
    "![image.png](https://camo.githubusercontent.com/e41af2fedc3c479e87ee43f4954572257545469c/687474703a2f2f63733233316e2e6769746875622e696f2f6173736574732f6e6e312f7369676d6f69642e6a706567)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_6\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_23 (Dense)             (None, 64)                50240     \n",
      "_________________________________________________________________\n",
      "dense_24 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_25 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_26 (Dense)             (None, 10)                650       \n",
      "=================================================================\n",
      "Total params: 59,210\n",
      "Trainable params: 59,210\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = keras.Sequential([\n",
    "    layers.Dense(64, activation='sigmoid', input_shape=(784,)),\n",
    "    layers.Dense(64, activation='sigmoid'),\n",
    "    layers.Dense(64, activation='sigmoid'),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "])\n",
    "model.compile(optimizer=keras.optimizers.Adam(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = model.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'validation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 0s 29us/sample - loss: 0.1526 - accuracy: 0.9529\n"
     ]
    }
   ],
   "source": [
    "result = model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.优化器\n",
    "![](https://camo.githubusercontent.com/246c076552c81303a7fcf65bda596179dc9b8418/687474703a2f2f63733233316e2e6769746875622e696f2f6173736574732f6e6e332f6f7074322e676966)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_7\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_27 (Dense)             (None, 64)                50240     \n",
      "_________________________________________________________________\n",
      "dense_28 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_29 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_30 (Dense)             (None, 10)                650       \n",
      "=================================================================\n",
      "Total params: 59,210\n",
      "Trainable params: 59,210\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = keras.Sequential([\n",
    "    layers.Dense(64, activation='sigmoid', input_shape=(784,)),\n",
    "    layers.Dense(64, activation='sigmoid'),\n",
    "    layers.Dense(64, activation='sigmoid'),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "])\n",
    "model.compile(optimizer=keras.optimizers.SGD(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = model.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'validation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 0s 44us/sample - loss: 2.1199 - accuracy: 0.4749\n"
     ]
    }
   ],
   "source": [
    "result = model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6.批正则化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_8\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_31 (Dense)             (None, 64)                50240     \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2 (Batc (None, 64)                256       \n",
      "_________________________________________________________________\n",
      "dense_32 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2_1 (Ba (None, 64)                256       \n",
      "_________________________________________________________________\n",
      "dense_33 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "batch_normalization_v2_2 (Ba (None, 64)                256       \n",
      "_________________________________________________________________\n",
      "dense_34 (Dense)             (None, 10)                650       \n",
      "=================================================================\n",
      "Total params: 59,978\n",
      "Trainable params: 59,594\n",
      "Non-trainable params: 384\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = keras.Sequential([\n",
    "    layers.Dense(64, activation='relu', input_shape=(784,)),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "])\n",
    "model.compile(optimizer=keras.optimizers.SGD(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = model.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'validation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 0s 25us/sample - loss: 0.1863 - accuracy: 0.9447\n"
     ]
    }
   ],
   "source": [
    "result = model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7.dropout\n",
    "![](https://camo.githubusercontent.com/9acd196479c9c42db52a9b7ecefaaa301abb07fa/68747470733a2f2f696d6167652e736c696465736861726563646e2e636f6d2f6c65637475726532392d636f6e766f6c7574696f6e616c6e657572616c6e6574776f726b732d766973696f6e737072696e67323031352d3135303530343131343134302d636f6e76657273696f6e2d6761746530322f39352f6c6563747572652d32392d636f6e766f6c7574696f6e616c2d6e657572616c2d6e6574776f726b732d636f6d70757465722d766973696f6e2d737072696e67323031352d36322d3633382e6a70673f63623d31343330373430303036)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_9\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_35 (Dense)             (None, 64)                50240     \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 64)                0         \n",
      "_________________________________________________________________\n",
      "dense_36 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 64)                0         \n",
      "_________________________________________________________________\n",
      "dense_37 (Dense)             (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 64)                0         \n",
      "_________________________________________________________________\n",
      "dense_38 (Dense)             (None, 10)                650       \n",
      "=================================================================\n",
      "Total params: 59,210\n",
      "Trainable params: 59,210\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = keras.Sequential([\n",
    "    layers.Dense(64, activation='relu', input_shape=(784,)),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "])\n",
    "model.compile(optimizer=keras.optimizers.SGD(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = model.fit(x_train, y_train, batch_size=256, epochs=100, validation_split=0.3, verbose=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'validation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 0s 27us/sample - loss: 0.6157 - accuracy: 0.8132\n"
     ]
    }
   ],
   "source": [
    "result = model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 8.模型集成\n",
    "下面是使用投票的方法进行模型集成"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](https://camo.githubusercontent.com/c5d820739f5ab9bef5ecbd8b8db585d11d858ecf/68747470733a2f2f656e637279707465642d74626e302e677374617469632e636f6d2f696d616765733f713d74626e3a414e643947635273314342534574707035796a36534a354b5f6e486431464e6679455961394b4c6a57666f4d595f763741525471337464705677)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from tensorflow.keras.wrappers.scikit_learn import KerasClassifier\n",
    "from sklearn.ensemble import VotingClassifier\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "def mlp_model():\n",
    "    model = keras.Sequential([\n",
    "    layers.Dense(64, activation='relu', input_shape=(784,)),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "    ])\n",
    "    model.compile(optimizer=keras.optimizers.SGD(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "    return model\n",
    "model1 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)\n",
    "model2 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)\n",
    "model3 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "ensemble_clf = VotingClassifier(estimators=[\n",
    "    ('model1', model1), ('model2', model2), ('model3', model3)\n",
    "], voting='soft')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('model1', <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object at 0x7f4ed7d4c518>), ('model2', <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object at 0x7f4ed7d4c470>), ('model3', <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object at 0x7f4ed7d4c588>)],\n",
       "         flatten_transform=None, n_jobs=None, voting='soft', weights=None)"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ensemble_clf.fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "acc:  0.9504\n"
     ]
    }
   ],
   "source": [
    "y_pred = ensemble_clf.predict(x_test)\n",
    "print('acc: ', accuracy_score(y_pred, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 9.全部使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras import layers\n",
    "\n",
    "import numpy as np\n",
    "from tensorflow.keras.wrappers.scikit_learn import KerasClassifier\n",
    "from sklearn.ensemble import VotingClassifier\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "def mlp_model():\n",
    "    model = keras.Sequential([\n",
    "    layers.Dense(64, activation='relu', kernel_initializer='he_normal', input_shape=(784,)),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(64, activation='relu', kernel_initializer='he_normal'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(64, activation='relu', kernel_initializer='he_normal'),\n",
    "    layers.BatchNormalization(),\n",
    "    layers.Dropout(0.2),\n",
    "    layers.Dense(10, activation='softmax')\n",
    "    ])\n",
    "    model.compile(optimizer=keras.optimizers.SGD(),\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "    return model\n",
    "model1 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)\n",
    "model2 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)\n",
    "model3 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)\n",
    "model4 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)\n",
    "ensemble_clf = VotingClassifier(estimators=[\n",
    "    ('model1', model1), ('model2', model2), ('model3', model3),('model4', model4)])\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "VotingClassifier(estimators=[('model1', <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object at 0x7f7183d246a0>), ('model2', <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object at 0x7f7183d245c0>), ('model3', <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object at 0x7f7183d5a198>), ('model4', <tensorflow.python.keras.wrappers.scikit_learn.KerasClassifier object at 0x7f71839c94e0>)],\n",
       "         flatten_transform=None, n_jobs=None, voting='hard', weights=None)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ensemble_clf.fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_predict = ensemble_clf.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'y_pred' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-11-c1dea66b1d3d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'acc: '\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maccuracy_score\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_pred\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m: name 'y_pred' is not defined"
     ]
    }
   ],
   "source": [
    "print('acc: ', accuracy_scoreecuracy_scorecuracy_score(y_pred, y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
